home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
music
/
musgfa.zoo
/
musex1.lst
< prev
next >
Wrap
File List
|
1992-12-24
|
18KB
|
854 lines
' musicex1 learn how to play piano / Nov 1 1992
' Seymour Shlien/ 624 Courtenay Avenue/ Ottawa/ K2A 3B5 Canada
' public domain
' programmed in GFA basic 3.5
REM BBR% position of black bars
REM WKYCOD% white key decoder (root)
REM BKYCOD% black key decoder (root)
REM WHCOD% white key decoder for keyboard
REM BLCOD% black key decoder for keyboard
DIM bbr%(5),wkycod%(7),bkycod%(7)
DIM whcod%(30),blcod%(25)
DIM kntps%(52),flps%(22),shps%(22)
DIM kylets$(13),kyletb$(13)
DIM sprite$(24)
DIM x1%(50),x2%(50),y1%(50),y2%(50) ! for mouse sensitive zones
DIM note_response%(50,3),samp_size%(50),av_response%(50)
DIM accidentals$(3),staff$(3),mode$(3),scale$(4),keep_stat$(2)
DIM permuted_notes%(100)
REM if usesharps% = 1 then sharps are used instead of flats
rez%=XBIOS(4)
IF rez%<>1
ALERT 3," Please switch to | medium resolution! ",1,"Oops",b%
STOP
ENDIF
DEFMOUSE 3
accid%=0
staff%=0
mode%=0
lont%=50
rnt%=15
wb%=180
config%=0
pass_resp%=30
notes_left%=0
lesson_num%=1
keep_stat%=0
note_range%=8
@initialize_arrays
@clear_response
@load_response
FOR i%=1 TO 1000
@select_parameters
NEXT i%
> PROCEDURE show_parameter(num%)
LOCAL k%
SELECT num%
CASE 0
TEXT 25,10,"Instructions"
CASE 1
TEXT 25,20,"Accidentals"
TEXT 120,20,SPACE$(8)
TEXT 120,20,accidentals$(accid%)
CASE 2
TEXT 25,30,"Staff"
TEXT 120,30,SPACE$(8)
TEXT 120,30,staff$(staff%)
CASE 3
TEXT 25,40,"Mode"
TEXT 120,40,SPACE$(16)
TEXT 120,40,mode$(mode%)
CASE 4
TEXT 25,50,""
CASE 5
TEXT 25,60,"Start"
CASE 6
TEXT 25,70,"Quit"
CASE 7
TEXT 25,80,"Show score"
CASE 8
IF mode%=1
TEXT 25,90,"Lesson"
TEXT 80,90,SPACE$(30)
TEXT 80,90,STR$(lesson_num%)
@set_range_for_lesson
k%=(lont%-25) DIV 12
j%=MOD(lont%,12)
TEXT 100,90,"from "+scale$(k%)+" "+kylets$(j%)
k%=(lont%+rnt%-29) DIV 12
j%=MOD(lont%+rnt%,12)
TEXT 215,90,"to "+scale$(k%)+" "+kylets$(j%)
ENDIF
CASE 9
IF config%=1
TEXT 25,100,"Save on exit"
TEXT 130,100,SPACE$(4)
TEXT 130,100,keep_stat$(keep_stat%)
ENDIF
CASE 10
IF config%=1
TEXT 25,110,"Clear score"
ENDIF
CASE 11
IF config%=1
TEXT 25,120,"Passing grade"
TEXT 140,120,SPACE$(4)
TEXT 140,120,STR$(pass_resp%)
ENDIF
CASE 12
IF config%=1
TEXT 25,130,"Note range"
TEXT 140,130,SPACE$(4)
TEXT 140,130,STR$(note_range%)
ENDIF
CASE 14
IF config%=1
TEXT 25,150,"Configuration done"
ENDIF
ENDSELECT
RETURN
> PROCEDURE show_all_parameters
LOCAL i%,n%
CLS
DEFTEXT 1,0
IF mode%=1
n%=11
ELSE
n%=9
ENDIF
IF config%=1
n%=14
ENDIF
FOR i%=0 TO n%
@show_parameter(i%)
NEXT i%
RETURN
> PROCEDURE select_parameters
LOCAL choice%,highlight%,i%
DEFFILL 0
PBOX 0,0,319,199
highlight%=0
@show_all_parameters
REPEAT
REPEAT
choice%=MOUSEY/10
key$=INKEY$
IF highlight%<>choice%
DEFTEXT 1,0
show_parameter(highlight%)
DEFTEXT 1,1
show_parameter(choice%)
highlight%=choice%
ENDIF
UNTIL MOUSEK<>0 OR key$="c"
IF MOUSEK=1 OR MOUSEK=2
modify_parameter(choice%)
ENDIF
IF key$="c"
config%=1
@show_all_parameters
FOR i%=0 TO 10
key$=INKEY$
NEXT i%
ENDIF
show_parameter(choice%)
PAUSE 20
DEFTEXT 1,0
UNTIL choice%=15
RETURN
> PROCEDURE modify_parameter(num%)
SELECT num%
CASE 0
@instructions
CASE 1
accid%=MOD(accid%+1,3)
IF accid%=0
accidentals%=0
ENDIF
IF accid%=1
accidentals%=1
usesharps%=0
ENDIF
IF accid%=2
accidentals%=1
usesharps%=1
ENDIF
CASE 2
staff%=MOD(staff%+1,3)
IF staff%=0
lesson_num%=5
ELSE
lesson_num%=1
ENDIF
IF mode%=1
show_parameter(8)
ENDIF
CASE 3
mode%=MOD(mode%+1,3)
IF mode%=1
show_parameter(8)
ENDIF
CASE 4
CASE 5
@display_staff_board
IF mode%=1
@set_range_for_lesson
ELSE IF mode%=0
IF staff%=1
lont%=30
rnt%=20
ELSE IF staff%=0
lont%=50
rnt%=27
ELSE
lont%=30
rnt%=47
ENDIF
lx1%=@x_from_note(lont%)-10
lx2%=@x_from_note(lont%+rnt%)+8
ELSE
@select_range
ENDIF
@exercise
CASE 6
IF keep_stat%=0
@save_response
ENDIF
END
CASE 7
@compute_avg_response
@show_score
CASE 8
IF mode%=1
INC lesson_num%
IF lesson_num%>10
IF staff%=0
lesson_num%=5
ELSE
lesson_num%=1
ENDIF
ENDIF
ENDIF
CASE 9
IF config%=1
keep_stat%=MOD(keep_stat%+1,2)
PRINT keep_stat%
ENDIF
CASE 10
IF config%=1
@clear_response
TEXT 120,110,"done"
ENDIF
CASE 11
IF config%=1
pass_resp%=MOD(pass_resp%,50)+5
ENDIF
CASE 12
IF config%=1
note_range%=MOD(note_range%,20)+2
ENDIF
CASE 14
IF config%=1
config%=0
@show_all_parameters
ENDIF
ENDSELECT
RETURN
'
> PROCEDURE initialize_arrays
@load_note_sprites
@read_black_keys
@read_key_decoders
@read_note_positions
@read_key_to_letter_converter
@read_option_strings
RETURN
> PROCEDURE display_staff_board
shfty%=40
CLS
DEFMOUSE 0
@draw_treble_bass_staff
@draw_keyboard
@draw_black_keys
RETURN
> PROCEDURE setup
@select_range
RETURN
> PROCEDURE load_note_sprites
OPEN "i",#1,"notes2.put"
FOR loop=1 TO 23
sprite$(loop)=INPUT$(CVI(INPUT$(2,#1)),#1)
NEXT loop
CLOSE #1
RETURN
> PROCEDURE draw_treble_bass_staff
DEFFILL 0
PBOX 5,10+shfty%,625,90+shfty%
COLOR 1
FOR i=1 TO 5
LINE 5,20+i*5+shfty%,625,20+i*5+shfty%
LINE 5,55+i*5+shfty%,625,55+i*5+shfty%
NEXT i
PUT 10,25+shfty%,sprite$(1),7
PUT 10,60+shfty%,sprite$(2),7
lstnte%=73
xp%=55
RETURN
> PROCEDURE draw_keyboard
wb%=180
wt%=180-40
REM draw white keys
FOR i%=0 TO 28
BOX i%*20,wb%,i%*20+18,wt%
NEXT i%
RETURN
> PROCEDURE read_black_keys
FOR i%=1 TO 5
READ bbr%(i%)
NEXT i%
DATA 13,35,57,93,117
RETURN
> PROCEDURE draw_black_keys
LOCAL j%,k%
DEFFILL 1
wb%=wb%-13
k%=1
REM draw black keys. The black keys are also zoned.
DEFFILL 1,1
FOR j%=0 TO 3
FOR i%=1 TO 5
PBOX bbr%(i%)+140*j%,wb%,bbr%(i%)+140*j%+10,wt%
set_zone(k%,bbr%(i%)+140*j%,wt%,bbr%(i%)+140*j%+10,wb%)
k%=k%+1
NEXT i%
NEXT j%
wb%=wb%+13
number_of_zones%=k%-1
RETURN
> PROCEDURE read_key_decoders
REM The decoders convert the key press to the note to be sounded.
FOR i%=1 TO 7
READ wkycod%(i%)
NEXT i%
FOR i%=1 TO 5
READ bkycod%(i%)
NEXT i%
k%=0
FOR j%=0 TO 3
FOR i%=1 TO 7
whcod%(k%)=wkycod%(i%)+30+j%*12
k%=k%+1
NEXT i%
NEXT j%
whcod%(28)=78
k%=1
FOR j%=0 TO 3
FOR i%=1 TO 5
blcod%(k%)=bkycod%(i%)+30+12*j%
k%=k%+1
NEXT i%
NEXT j%
DATA 0,2,4,6,7,9,11
DATA 1,3,5,8,10
RETURN
> PROCEDURE read_note_positions
REM read the vertical position to display the note sprites on
REM the treble or bass staff.
REM negative numbers are pointers to sharp or flat notes.
REM FLPS are the flat note positions
REM SHPS are the sharp note positions.
FOR i%=1 TO 49
READ kntps%(i%)
NEXT i%
FOR i%=1 TO 21
READ flps%(i%)
NEXT i%
FOR i%=1 TO 20
READ shps%(i%)
NEXT i%
DATA 67,-1,65,-2,62,-3,60,58,-4,55
DATA -5,63,61,-6,59,-7,56,-8,54,52
DATA -9,32,-10,30,28,-11,25,-12,23,-13
DATA 20,28,-14,26,-15,23,21,-16,19,-17
DATA 17,-18,15,13,-19,11,-20,9,-21
REM
DATA 65,62,60,55,63,59,57,54,32,30
DATA 25,23,20,26,23,19,17,15,11,9
DATA 7
REM
DATA 67,65,62,58,55,61,59,56,52,32
DATA 28,25,23,28,26,21,19,17,13,11
RETURN
> PROCEDURE read_key_to_letter_converter
REM First sharps